#include <string>
#include <iostream>
#include <stddef.h>

#include <security/pam_modules.h>
#include <security/pam_ext.h>

#ifdef __cplusplus
#define __BEGIN_EXTERN extern "C" {
#define __END_EXTERN }
#else
#define __BEGIN_EXTERN
#define __END_EXTERN
#endif

__BEGIN_EXTERN

/**
 * @brief 账号认证接口
 *
 * @param pamh PAM句柄
 * @param flags PAM会话标识
 * @param argc 写在PAM配置文件的PAM参数的个数
 * @param argv 写在PAM配置文件的PAM参数
 * @return int PAM会话结果，0表示成功，非0表示问题代码
 */
int pam_sm_authenticate(pam_handle_t *pamh, int flags, int argc, const char **argv)
{
    pam_error(pamh, "test yang");
    std::cout << "hello world!" << std::endl;
    return PAM_SUCCESS;
}

/**
 * @brief 账号管理接口
 *
 * @param pamh PAM句柄
 * @param flags PAM会话标识
 * @param argc 写在PAM配置文件的PAM参数的个数
 * @param argv 写在PAM配置文件的PAM参数
 * @return int PAM会话结果，0表示成功，非0表示问题代码
 */
int pam_sm_acct_mgmt(pam_handle_t *pamh, int flags, int argc, const char **argv)
{
    return PAM_SUCCESS;
}

/**
 * @brief 用户会话开始接口，比如账号登录成功事件
 *
 * @param pamh PAM句柄
 * @param flags PAM会话标识
 * @param argc 写在PAM配置文件的PAM参数的个数
 * @param argv 写在PAM配置文件的PAM参数
 * @return int PAM会话结果，0表示成功，非0表示问题代码
 */
int pam_sm_open_session(pam_handle_t *pamh, int flags, int argc, const char **argv)
{
    return PAM_SUCCESS;
}

/**
 * @brief 用户会话关闭接口，比如账号注销事件
 *
 * @param pamh PAM句柄
 * @param flags PAM会话标识
 * @param argc 写在PAM配置文件的PAM参数的个数
 * @param argv 写在PAM配置文件的PAM参数
 * @return int PAM会话结果，0表示成功，非0表示问题代码
 */
int pam_sm_close_session(pam_handle_t *pamh, int flags, int argc, const char **argv)
{
    return PAM_SUCCESS;
}

/**
 * @brief 修改账号密码接口，比如运行passwd命令
 *
 * @param pamh PAM句柄
 * @param flags PAM会话标识
 * @param argc 写在PAM配置文件的PAM参数的个数
 * @param argv 写在PAM配置文件的PAM参数
 * @return int PAM会话结果，0表示成功，非0表示问题代码
 */
int pam_sm_chauthtok(pam_handle_t *pamh, int flags, int argc, const char **argv)
{
    return PAM_SUCCESS;
}

/**
 * @brief PAM会话账号凭证接口
 *
 * @param pamh PAM句柄
 * @param flags PAM会话标识
 * @param argc 写在PAM配置文件的PAM参数的个数
 * @param argv 写在PAM配置文件的PAM参数
 * @return int PAM会话结果，0表示成功，非0表示问题代码
 */
int pam_sm_setcred(pam_handle_t *pamh, int flags, int argc, const char **argv)
{
    return PAM_SUCCESS;
}

__END_EXTERN
